Последние изменения - Поиск:

edit SideBar

ПреобразованиеТипов

Два способа преобразования типов известны, но нигде не документированы.

 LONGINT(выражение), INTEGER(выражение)

На 2012-11-26 можно преобразовывать таким способом числовые, адресные и размерные типы к числовым. Код, который этим занимается, можно найти по сообщению "invalid type in explicit conversion" (FoxSemanticChecker.Mod). Говорят, что позднее это обобщили.

 выражение(ТипЗаписи)
- type guard. Работает для записей на 2012-11-26. Код находится

по сообщению "no type extension of type" (FoxSemanticChecker.NewTypeGuardDesignator). Вот комментарий:

 
(** return type guard designator left(type)
                        - check if type can be extended (i.e. is no static record)
                        - check if type is a type extension of left.type
                        - returns new type guard designator
                        returns invalidDesignator = invalidExpression if error
                **)

В переводе:

  • проверяет, что тип может быть расширен (т.е. это не статическая запись)
  • проверяет, что тип является расширением типа аргумента

В отчёте по оберону это называется typeguard и там описывается так:

  • в v(T) - T - расширение объявленного типа v
  • и v - изменяемый параметр типа "запись" или указатель

Говорят, что это расширили.

Потеря данных при преобразовании типов происходит. Нет ошибки при преобразованиях таких, как UNSIGNED16(значение типа UNSIGNED32), но как именно они теряются - неясно из-за того, что сломаны либо сами преобразования, либо печать :)

Во всяком случае, CHR(число>256) просто отбрасывает старшие разряды, и если дать на вход код русского "Т", то получится двойная кавычка.

См. также https://gitlab.com/budden/jaos/-/issues/31 - про странное преобразование 129 из UNSIGNED8 в SIGNED64 - получается огромное отрицательное число.

Править - История - Печать - Последние изменения - Поиск
Редакция от 26.04.2020 00:12